package com.jwell.panprovider.ui.custom;

import android.annotation.SuppressLint;
import android.content.Context;
import android.content.SharedPreferences;
import android.os.Handler;
import android.util.AttributeSet;
import android.util.Log;

import java.util.Timer;
import java.util.TimerTask;

/**
 * 倒计时Button
 */
public class mDownTimeButton extends android.support.v7.widget.AppCompatButton {
    private long totalTime = 60 * 1000;//倒计时长度,默认60秒
    private long totalTimeRember = totalTime;//记录倒计时长度，用于重新开始倒计时时重置时间长度
    private long intervalTime = 1000;//倒计时间隔，默认1秒
    private long saveRemainingTime = -1; //用于保存的倒计时剩余时间
    private long saveCurrentTime = 0; //用于保存的当前时间
    private long time = 1; //记录重新打开时倒计时的时间
    private String textafter = "重新获取（"; //点击后显示的内容
    private String textbefore = "获取验证码"; //点击前显示的内容
    private String TOTAL_TIME = "totalTime"; //倒计时Button名字
    private String CURRENT_TIME = "currentTime"; //系统时间，用于记录Activity关闭时，系统时间
    private Timer timer;
    private TimerTask timerTask;
    private boolean isStart = false;//表示是否处于倒计时状态
//    private static Map<String, Long> timeMap = null;// 用于存放获取验证码倒计时时间

    /**
     * 显示样式，例如：重新获取（60）
     */
    private static final short STYLE_TEXT_TIME = 0;

    /**
     * 显示样式，例如：60秒后重新获取
     */
    private static final short STYLE_TIME_TEXT = 1;
    @SuppressLint("HandlerLeak")
    Handler handler = new Handler() {
        @Override
        public void handleMessage(android.os.Message msg) {
            mDownTimeButton.this.setText(textafter + totalTime / intervalTime + "）");
            totalTime -= intervalTime;//倒计时减少间隔时间
            if (totalTime < 0) {//倒计时结束
                mDownTimeButton.this.setEnabled(true);//button可用
                mDownTimeButton.this.setText(textbefore);//设置button点击前显示的内容
                clearTimer();//清除倒计时任务
                totalTime = totalTimeRember;//记录倒计时时长
                isStart = false;//不处于倒计时状态
            }
        }
    };

    public mDownTimeButton(Context context) {
        super(context);

    }

    public mDownTimeButton(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public void onCreate() {
        onCreate("", totalTime, intervalTime);
    }

    public void onCreate(String buttonName) {
        onCreate(buttonName, totalTime, intervalTime);
    }

    public void onCreate(String buttonName, long totalTime) {
        onCreate(buttonName, totalTime, intervalTime);
    }

    /**
     * 在Activity的onCreate方法中同步调用该方法，用于设置倒计时并判断是否上次未完成倒计时
     *
     * @param buttonName   倒计时按钮名字，用于多个倒计时按钮时区分
     * @param totalTime    倒计时时间长度
     * @param intervalTime 倒计时间隔时长
     */
    public void onCreate(String buttonName, long totalTime, long intervalTime) {

        //此处应该加一个buttonName是否为空的判断

        //设置倒计时时长，记录倒计时时长，倒计时间隔时长
        this.totalTime = totalTime;
        this.totalTimeRember = totalTime;
        this.intervalTime = intervalTime;

        //设置Button的名字，用于分开存储倒计时时间
        if (!TOTAL_TIME.equals(buttonName + "totalTime")) {
            TOTAL_TIME = buttonName + "totalTime";
        }
        if (!CURRENT_TIME.equals(buttonName + "currentTime")) {
            CURRENT_TIME = buttonName + "currentTime";
        }

        //获取保存的倒计时信息
        getTime();
        //没有未完成的计时
        if (saveRemainingTime == -1) {
            return;
        }
        //有未完成倒计时，获取倒计时剩余时间
        time = System.currentTimeMillis() - saveCurrentTime - saveRemainingTime;
        //清除保存的倒计时信息
        cleanTime();

        //根据剩余时间判断，time大于0则表示倒计时已经结束，小于0则表示倒计时还未结束，
        // 如果剩余时间已经结束则不倒计时，如果剩余时间还未结束则继续倒计时
        if (time > 0) {
            return;
        } else {
            isStart = true; //处于倒计时状态
            this.totalTime = Math.abs(time); //取绝对值
            initTimer(); //设置倒计时任务
            timer.schedule(timerTask, 0, intervalTime);//开始倒计时任务
            this.setText(textafter + time + "）"); //设置button显示内容
            this.setEnabled(false);//button设置不可用
        }
    }

    /**
     * onStop()方法同步
     */
    public void onStop() {
        if (isStart) { //根据是否是倒计时状态来存储
            saveTime();
        }
        clearTimer();
    }

    /**
     * 设置计时时候显示的文本
     */
    public mDownTimeButton setTextAfter(String textPressedAfter, short style) {
        this.textafter = textPressedAfter;
        return this;
    }

    /**
     * 设置点击之前的文本
     */
    public mDownTimeButton setTextBefore(String textPressedBefore) {
        this.textbefore = textPressedBefore;
        this.setText(textbefore);
        return this;
    }


    /**
     * 开始倒计时
     */
    public void startDownTime() {
        isStart = true;//设置为倒计时状态
        initTimer();
        this.setText(textafter + totalTime / intervalTime + "）");
        this.setEnabled(false);
        timer.schedule(timerTask, 0, intervalTime);
    }

    /**
     * 创建定时器
     */
    private void initTimer() {
        timer = new Timer();
        timerTask = new TimerTask() {
            @Override
            public void run() {
                handler.sendEmptyMessage(0x01);
            }
        };
    }

    /**
     * 清除定时器
     */
    private void clearTimer() {
        if (timerTask != null) {
            timerTask.cancel();
            timerTask = null;
        }
        if (timer != null)
            timer.cancel();
        timer = null;
    }

    /**
     * 存入Time
     */
    private void saveTime() {
        SharedPreferences sp = getContext().getSharedPreferences("DownTimeButton", Context.MODE_PRIVATE);
        SharedPreferences.Editor e = sp.edit();
        e.putLong(TOTAL_TIME, totalTime);
        e.putLong(CURRENT_TIME, System.currentTimeMillis());
        e.commit();
        Log.i("TAG", "存入");
    }

    private void getTime() {
        SharedPreferences sp = getContext().getSharedPreferences("DownTimeButton", Context.MODE_PRIVATE);
        saveRemainingTime = sp.getLong(TOTAL_TIME, -1);
        saveCurrentTime = sp.getLong(CURRENT_TIME, 0);
    }

    private void cleanTime() {
        SharedPreferences sp = getContext().getSharedPreferences("DownTimeButton", Context.MODE_PRIVATE);
        SharedPreferences.Editor e = sp.edit();
        e.putLong(TOTAL_TIME, -1);
        e.putLong(CURRENT_TIME, 0);
        e.commit();
    }
}

